Select +/- One
競プロ典型90問
https://atcoder.jp/contests/typical90/tasks/typical90_x
Travelingと同じことをしそうt6o_o6t.icon
パターンが視える
ちょうどK回で達成できるか問題
$ iについて、$ A_iから$ B_iに寄せたい場合
基本的には単調に増やすか、減らすか
例えば、$ A_i = 3, B_i = 5なら、$ B_i - A_i = 2回操作すればよい
Nの制約は緩い
考えるべきケース
K回使い切っても達成できない場合
Kが最小操作回数未満であると言い換える
最小操作回数は、$ \sum|B_i - Ai|である
K回使い切るまでに達成できてしまう場合
「達成できな」くはない場合と言い換えるt6o_o6t.icon
例えば、K = 7で、最小操作回数が4なら、残りの3回で辻褄を合わせる必要がある
1回の場合辻褄は合わないが、2回であれば、1回目の操作を戻せばよい
$ K-\sum|B_i-Ai|\equiv 0 \mod 2が成り立てばよい
剰余演算子の優先順位に引っかかったt6o_o6t.icon
三項演算子の優先順位の問題は回避した
code:bad_amari.cpp
cout << (k - sum % 2 == 0 ? "Yes" : "No") << endl;
剰余演算子の優先順位は乗算、除算と同じ
code:ok_amari.cpp
cout << ((k - sum) % 2 == 0 ? "Yes" : "No") << endl;
https://atcoder.jp/contests/typical90/submissions/45710475 AC.icont6o_o6t.icon